package com.alalei.moodview;

import android.content.Context;
import android.graphics.Color;

import com.github.mikephil.charting.charts.LineChart;
import com.github.mikephil.charting.components.Legend;
import com.github.mikephil.charting.components.XAxis;
import com.github.mikephil.charting.components.YAxis;
import com.github.mikephil.charting.data.Entry;
import com.github.mikephil.charting.data.LineData;
import com.github.mikephil.charting.data.LineDataSet;

import java.util.ArrayList;
import java.util.List;

/**
 * Author LEI
 * Date 2019/7/23
 * Description 心情指数图表
 */
public class MoodChart {

    private static MoodChart instance;
    private Context context;

    private String[] xValues = new String[]{
            "0-2", "2-4", "4-6", "6-8", "8-10", "10-12", "12-14", "14-16", "16-18", "18-20", "20-22", "22-24"
    };

    private MoodChart(Context context) {
        this.context = context;
    }

    public static MoodChart getInstance(Context context) {
        if (instance == null) {
            synchronized (MoodChart.class) {
                if (instance == null) {
                    instance = new MoodChart(context);
                }
            }
        }
        return instance;
    }

    public void initLineChart(LineChart lineChart) {
        lineChart.setViewPortOffsets(20, 20, 20, 120);
//        lineChart.setBackgroundColor(Color.rgb(104, 241, 175));
        lineChart.setBackgroundColor(Color.WHITE);

//        // no description text
//        lineChart.getDescription().setEnabled(false);
//
//        // enable touch gestures
//        lineChart.setTouchEnabled(true);
//
//        // enable scaling and dragging
//        lineChart.setDragEnabled(true);
//        lineChart.setScaleEnabled(true);
//
//        // if disabled, scaling can be done on x- and y-axis separately
//        lineChart.setPinchZoom(false);
//
//        lineChart.setDrawGridBackground(false);
//        lineChart.setMaxHighlightDistance(300);

        lineChart.setLogEnabled(true);//打印日志
        lineChart.getDescription().setEnabled(false);//取消描述文字
        lineChart.setNoDataText("没有数据");//没有数据时显示的文字
        lineChart.setNoDataTextColor(Color.WHITE);//没有数据时显示文字的颜色
        lineChart.setDrawGridBackground(false);//lineChart 绘图区后面的背景矩形将绘制
        lineChart.setDrawBorders(false);//是否禁止绘制图表边框的线
        lineChart.setBorderColor(Color.WHITE); //设置 lineChart 边框线的颜色。
        lineChart.setBorderWidth(1f); //设置 lineChart 边界线的宽度，单位 dp。
        lineChart.setTouchEnabled(true);     //能否点击
        lineChart.setDragEnabled(false);   //能否拖拽
        lineChart.setScaleEnabled(false);  //能否缩放
        lineChart.animateX(1000);//绘制动画 从左到右
        lineChart.setDoubleTapToZoomEnabled(false);//设置是否可以通过双击屏幕放大图表。默认是true
        lineChart.setHighlightPerDragEnabled(false);//能否拖拽高亮线(数据点与坐标的提示线)，默认是true
        lineChart.setDragDecelerationEnabled(false);//拖拽滚动时，手放开是否会持续滚动，默认是true（false是拖到哪是哪，true拖拽之后还会有缓冲）

        //获取图例对象
        Legend legend = lineChart.getLegend();
        //设置图例不显示
        legend.setEnabled(false);

        initXYAxis(lineChart);

        // create marker to display box when values are selected
        MoodMarkerView moodMarkerView = new MoodMarkerView(context, R.layout.mood_chart_marker_view);

        // Set the marker to the chart
        moodMarkerView.setChartView(lineChart);
        lineChart.setMarker(moodMarkerView);
    }

    /**
     * 初始化XY轴
     *
     * @param lineChart
     */
    private void initXYAxis(LineChart lineChart) {
        //自定义x轴显示
        MoodXAxisValueFormatter formatter = new MoodXAxisValueFormatter(xValues);
        XAxis xAxis = lineChart.getXAxis();
//        xAxis.setEnabled(false);
//        xAxis.setLabelCount(12, true);
        //显示个数
        xAxis.setLabelCount(xValues.length, true);
        xAxis.setValueFormatter(formatter);

        xAxis.setTextColor(Color.parseColor("#ADADB7"));
        xAxis.setPosition(XAxis.XAxisPosition.BOTTOM);
        xAxis.setDrawGridLines(true);
        xAxis.setAxisLineColor(Color.parseColor("#ADADB7"));
        xAxis.setLabelRotationAngle(90);
//        xAxis.setAvoidFirstLastClipping(true);//设置X轴避免图表或屏幕的边缘的第一个和最后一个轴中的标签条目被裁剪


//        YAxis leftYAxis = lineChart.getAxisLeft();
//        leftYAxis.setLabelCount(6, false);
//        leftYAxis.setTextColor(Color.parseColor("#ADADB7"));
//        leftYAxis.setPosition(YAxis.YAxisLabelPosition.INSIDE_CHART);
//        leftYAxis.setAxisLineColor(Color.parseColor("#ADADB7"));
//
//        leftYAxis.setDrawAxisLine(false);
//        leftYAxis.setDrawZeroLine(true);
//        leftYAxis.setDrawGridLines(false);

        YAxis leftYAxis = lineChart.getAxisLeft();
        leftYAxis.setEnabled(false);
        
        YAxis rightYAxis = lineChart.getAxisRight();
        rightYAxis.setEnabled(false);
    }

    /**
     * 曲线初始化设置 一个LineDataSet 代表一条曲线
     *
     * @param lineDataSet 线条
     * @param lineColor   线条颜色
     * @param mode
     */
    private void initLineDateSet(final LineChart lineChart, LineDataSet lineDataSet, int lineColor, LineDataSet.Mode mode) {

        lineDataSet.setCubicIntensity(0.2f);
        lineDataSet.setDrawFilled(true);//设置折线图填充
//        lineDataSet.setFormLineWidth(1f);
//        lineDataSet.setFormSize(15.f);
        lineDataSet.setDrawCircles(false);//是否显示圆
        lineDataSet.setDrawCircleHole(false);//是否是空心圆
        lineDataSet.setHighlightEnabled(true);//是否高亮显示
        lineDataSet.setDrawHighlightIndicators(true);

        lineDataSet.setLineWidth(1f);// 线宽，折线的线宽
        lineDataSet.setCircleRadius(2f);
        lineDataSet.setCircleColor(lineColor);
        lineDataSet.setCircleHoleRadius(2f);
        lineDataSet.setCircleHoleColor(lineColor);
        lineDataSet.setHighLightColor(lineColor);
        lineDataSet.setColor(lineColor);//折线的颜色
        lineDataSet.setFillColor(lineColor);
        lineDataSet.setFillAlpha(100);
        lineDataSet.setDrawValues(false);//是否在点上绘制values
//        lineDataSet.setValueTextSize(10f);//设置点上value大小
        lineDataSet.setDrawHorizontalHighlightIndicator(false); //画高亮线的横线
        lineDataSet.setDrawVerticalHighlightIndicator(false); //画高亮线的竖线
//        lineDataSet.setFillFormatter(new IFillFormatter() {
//            @Override
//            public float getFillLinePosition(ILineDataSet dataSet, LineDataProvider dataProvider) {
//                return lineChart.getAxisLeft().getAxisMinimum();
//            }
//        });

        if (mode == null) {
            //设置曲线展示为圆滑曲线（如果不设置则默认折线）
            lineDataSet.setMode(LineDataSet.Mode.CUBIC_BEZIER);
        } else {
            lineDataSet.setMode(mode);
        }
    }

    /**
     * 展示多条曲线
     *
     * @param lineChart
     * @param lineDataSets
     */
    public void showLineChart(LineChart lineChart, LineDataSet... lineDataSets) {
        LineData lineData = new LineData();
        lineData.setValueTextSize(9f);
        lineData.setDrawValues(false);
        for (LineDataSet lineDataSet : lineDataSets) {
            lineData.addDataSet(lineDataSet);
        }
        lineChart.setData(lineData);
    }

    /**
     * 添加曲线--笑
     *
     * @param lineChart
     * @param dataList
     * @param name
     * @param lineColor
     * @return
     */
    public LineDataSet addLineChartSmlie(LineChart lineChart, List<MoodChartBean> dataList, String name, int lineColor) {

        List<Entry> entries = new ArrayList<>();
        for (int i = 0; i < dataList.size(); i++) {
            MoodChartBean data = dataList.get(i);
            /**
             * 在此可查看 Entry构造方法，可发现 可传入数值 Entry(float x, float y)
             * 也可传入Drawable， Entry(float x, float y, Drawable icon) 可在XY轴交点 设置Drawable图像展示
             */
            Entry entry = new Entry(i, (float) data.getSmile());
            entries.add(entry);
        }

        // 每一个LineDataSet代表一条线
        LineDataSet lineDataSet;
        if (lineChart.getData() != null && lineChart.getData().getDataSetCount() > 0) {
            lineDataSet = (LineDataSet) lineChart.getData().getDataSetByIndex(0);
            lineDataSet.setValues(entries);
            lineChart.getData().notifyDataChanged();
            lineChart.notifyDataSetChanged();

        } else {
            lineDataSet = new LineDataSet(entries, name);
            initLineDateSet(lineChart, lineDataSet, lineColor, LineDataSet.Mode.CUBIC_BEZIER);
        }

        return lineDataSet;
    }

    /**
     * 添加曲线--哭
     *
     * @param lineChart
     * @param dataList
     * @param name
     * @param lineColor
     * @return
     */
    public LineDataSet addLineChartCry(LineChart lineChart, List<MoodChartBean> dataList, String name, int lineColor) {

        List<Entry> entries = new ArrayList<>();
        for (int i = 0; i < dataList.size(); i++) {
            MoodChartBean data = dataList.get(i);
            /**
             * 在此可查看 Entry构造方法，可发现 可传入数值 Entry(float x, float y)
             * 也可传入Drawable， Entry(float x, float y, Drawable icon) 可在XY轴交点 设置Drawable图像展示
             */
            Entry entry = new Entry(i, 0 - (float) data.getCry());
            entries.add(entry);
        }

        // 每一个LineDataSet代表一条线
        LineDataSet lineDataSet;
        if (lineChart.getData() != null && lineChart.getData().getDataSetCount() > 0) {
            lineDataSet = (LineDataSet) lineChart.getData().getDataSetByIndex(0);
            lineDataSet.setValues(entries);
            lineChart.getData().notifyDataChanged();
            lineChart.notifyDataSetChanged();

        } else {
            lineDataSet = new LineDataSet(entries, name);
            initLineDateSet(lineChart, lineDataSet, lineColor, LineDataSet.Mode.CUBIC_BEZIER);
        }

        return lineDataSet;
    }

}
